root@5862577-oj93961:~# cat /usr/local/bin/check-vpn-limits
#!/bin/bash
echo "┌──────────────────────────────────────────────────┐"
echo "│           AmneziaWG Traffic Control v1.2         │"
echo "└──────────────────────────────────────────────────┘"
echo ""

# === Auto-detect container and interface ===
# Supported container names in order of preference
POSSIBLE_CONTAINERS=("amnezia-awg" "amnezia-awg2")
CONTAINER=""
for name in "${POSSIBLE_CONTAINERS[@]}"; do
    if docker ps --format '{{.Names}}' 2>/dev/null | grep -xq "$name"; then
        CONTAINER="$name"
        break
    fi
done

# helper to run docker exec if container found
docker_exec() {
    if [ -z "$CONTAINER" ]; then
        return 1
    fi
    docker exec "$CONTAINER" "$@"
}

# detect interface name inside container (prefer wg*, tun*, amnezia*, veth*)
IF=""
if [ -n "$CONTAINER" ]; then
    IF=$(docker_exec sh -c "ip -o link show 2>/dev/null | awk -F': ' '{print \$2}'" 2>/dev/null | \
        egrep -o '^(wg[0-9]+|wg|amnezia[0-9]*|tun[0-9]+|veth[0-9]+)' | head -n1 || true)

    # fallback: pick first iface that has an ipv4 address inside container
    if [ -z "$IF" ]; then
        IF=$(docker_exec sh -c "ip -o -4 addr show 2>/dev/null | awk '{print \$2}'" 2>/dev/null | head -n1 || true)
    fi
fi

# final fallback to wg0 for backwards-compatibility (if nothing found)
IF=${IF:-wg0}

# 1. Состояние системы
echo "📊 СИСТЕМНЫЙ СТАТУС:"
if systemctl is-active amnezia-tc.service >/dev/null 2>&1; then
    echo "   Сервис: ✅ активен"
else
    echo "   Сервис: ❌ неактивен"
fi

if systemctl is-active amnezia-tc.timer >/dev/null 2>&1; then
    next_time=$(systemctl list-timers --all | grep amnezia 2>/dev/null | head -1 | awk '{print $2, $3, $4, $5}')
    if [ -n "$next_time" ]; then
        echo "   Таймер: ✅ активен (след. запуск: $next_time)"
    else
        echo "   Таймер: ✅ активен (расписание не найдено)"
    fi
else
    echo "   Таймер: ❌ неактивен"
fi

# container status (if found)
if [ -n "$CONTAINER" ]; then
    container_status=$(docker ps --filter "name=^${CONTAINER}$" --format '{{.Status}}' 2>/dev/null)
    echo "   Контейнер: ✅ ${CONTAINER} — ${container_status}"
else
    # Try to detect if any amnezia container exists at all (for clearer message)
    any_amnezia=$(docker ps --format '{{.Names}}' 2>/dev/null | grep -i amne || true)
    if [ -n "$any_amnezia" ]; then
        echo "   Контейнер: ❌ ожидается amnezia-awg/awg2, но не найден в списке запущенных контейнеров. Найдены: $any_amnezia"
    else
        echo "   Контейнер: ❌ не запущен"
    fi
fi
echo ""

# 2. Клиенты
echo "👥 ПОДКЛЮЧЕННЫЕ КЛИЕНТЫ:"
if [ -n "$CONTAINER" ]; then
    docker_exec wg show 2>/dev/null | awk '
    BEGIN {count=0}
    /^peer:/ {peer=$2}
    /allowed ips:/ {ip=$3; gsub("/32","",ip)}
    /latest handshake:/ {
        if ($3 == "Never") {
            status="❌ отключен"
            time="никогда"
        } else {
            time=$3" "$4
            if ($4 ~ /second|minute/) status="✅ онлайн"
            else if ($4 ~ /hour/) status="⚠ давно"
            else status="✅ онлайн"
        }
    }
    /transfer:/ {
        rx=$3; tx=$6
        printf "   • %-15s %-15s %8s ↓ / %8s ↑\n", ip, status, rx, tx
        count++
    }'
    if ! docker ps --format '{{.Names}}' 2>/dev/null | grep -q -x "$CONTAINER"; then
        echo "   Контейнер не запущен"
    fi
else
    echo "   Контейнер не запущен — не могу показать клиентов (wg)."
fi
echo ""

# 3. Ограничения TC
echo "⏸️  ОГРАНИЧЕНИЯ ТРАФИКА (70 Мбит/с):"
if [ -n "$CONTAINER" ]; then
    count=$(docker_exec sh -c "tc class show dev ${IF} 2>/dev/null | grep -c 'rate 70Mbit'" 2>/dev/null || true)
    if [ -n "$count" ] && [ "$count" -gt 0 ]; then
        echo "   Классы TC:"
        docker_exec sh -c "tc class show dev ${IF} 2>/dev/null | grep 'rate 70Mbit'" 2>/dev/null | \
            while read -r line; do
                class_id=$(echo "$line" | awk '{print $2}' | cut -d: -f2)
                if [ -n "$class_id" ]; then
                    echo "   • Класс 1:$class_id → 70 Мбит/с"
                fi
            done
        echo "   ✅ Ограничения активны для $count клиентов"
    else
        echo "   ❌ Нет активных ограничений"
    fi
else
    echo "   Контейнер не запущен"
fi
echo ""

# 4. Статистика фильтров
echo "📈 СТАТИСТИКА ФИЛЬТРОВ:"
if [ -n "$CONTAINER" ]; then
    docker_exec sh -c "tc -s filter show dev ${IF} parent 1: 2>/dev/null" 2>/dev/null | \
        grep -B1 -A1 "flowid" | while read -r line1; do
            if echo "$line1" | grep -q "flowid"; then
                read -r line2
                read -r line3
                class=$(echo "$line1" | grep -o "flowid 1:[0-9]*" | cut -d: -f2)
                hex_ip=$(echo "$line2" | grep -o "match [0-9a-f]*" | awk '{print $2}')
                success=$(echo "$line3" | grep -o "success [0-9]*" | awk '{print $2}')

                if [ -n "$hex_ip" ] && [ -n "$class" ]; then
                    ip=$(printf "%d.%d.%d.%d" \
                        0x${hex_ip:0:2} \
                        0x${hex_ip:2:2} \
                        0x${hex_ip:4:2} \
                        0x${hex_ip:6:2} 2>/dev/null)

                    if [ -n "$success" ] && [ "$success" -gt 0 ]; then
                        echo "   • $ip → активен ($success пакетов)"
                    else
                        echo "   • $ip → ожидание трафика"
                    fi
                fi
            fi
        done
    if ! docker_exec sh -c "tc -s filter show dev ${IF} parent 1: 2>/dev/null" 2>/dev/null | grep -q "flowid"; then
        echo "   Нет активных фильтров"
    fi
else
    echo "   Контейнер не запущен"
fi
echo ""

# 5. Последние события
echo "🔄 ПОСЛЕДНИЕ СОБЫТИЯ:"
if [ -f "/var/log/amnezia-tc.log" ]; then
    tail -3 /var/log/amnezia-tc.log | while read -r line; do
        message=$(echo "$line" | cut -d']' -f2-)
        echo "   $message"
    done
else
    echo "   Лог-файл не найден"
fi

echo ""
echo "┌──────────────────────────────────────────────────┐"
echo "│ СИСТЕМА ГОТОВА К ЭКСПЛУАТАЦИИ! 🎉                │"
echo "│                                                  │"
echo "│ Проверено:                                       │"
echo "│   ✅ Автозапуск после перезагрузки               │"
echo "│   ✅ Автоматическое восстановление правил        │"
echo "│   ✅ Ограничение 70 Мбит/с на клиента            │"
echo "│   ✅ Обнаружение новых клиентов                  │"
echo "└──────────────────────────────────────────────────┘"
echo ""
echo "📋 Команды управления:"
echo "   check-vpn-limits                 - этот отчет"
echo "   systemctl restart amnezia-tc.service - перезапуск"
echo "   journalctl -u amnezia-tc.service -f - логи"
echo "   docker restart ${CONTAINER:-amnezia-awg2}       - перезапуск WG (поменяйте имя при необходимости)"